#pragma once
#include <iostream>

class Day
{
public:
	explicit Day(int d):val(d){}
private:
	int val;
};

class Month
{
public:
	static Month& Jan(){ static Month m(1); return m; }
	static Month& Feb(){ static Month m(2); return m; }
	static Month& Mar(){ static Month m(3); return m; }
	static Month& Apr(){ static Month m(4); return m; }
	static Month& May(){ static Month m(5); return m; }
	static Month& Jun(){ static Month m(6); return m; }
	static Month& Jul(){ static Month m(7); return m; }
	static Month& Aug(){ static Month m(8); return m; }
	static Month& Sep(){ static Month m(9); return m; }
	static Month& Oct(){ static Month m(10);return m; }
	static Month& Nov(){ static Month m(11);return m; }
	static Month& Dec(){ static Month m(12);return m; }

private:
	explicit Month(int m):val(m){}
	int val;
};

class Year
{
public:
	explicit Year(int y):val(y){}

private:
	int val;
};

class Date
{
public:
	Date(const Month& m, const Day& d, const Year& y)
		:month(m),day(d),year(y){}

private:
	Month month;
	Day day;
	Year year;

};

class Type
{
public:
	Type():m(0)
	{ std::cout<<"Default Construntor"<<std::endl;}
	Type(const Type& t):m(t.m)
	{ std::cout<<"Copy Constructor"<<std::endl;}
	operator int() const{return m;}

private:
	int m;
	
};